package de.preisrobot.service;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import de.preiscrawler.parser.Parser;
import de.preisrobot.entity.AmazonArtikelImage;
import de.preisrobot.entity.Artikel;
import de.preisrobot.entity.CrawlerLinkUrl;
import de.preisrobot.persistence.dao.ArtikelDao;
import de.preisrobot.service.internal.AmazonImageGrabber;
import de.preisrobot.service.internal.PreisRobotParserException;

@Service
public class GenericGrabberService implements GrabberService {

	private static Logger log = Logger.getLogger(GenericGrabberService.class);

	@Resource(name = "artikelDaoImpl")
	private ArtikelDao dao;

	private Parser parser;

	@Override
	public void setParser(Parser p) {
		this.parser = p;
	}

	@Override
	public List<Artikel> grapUrl(CrawlerLinkUrl sourceUrlString) {

		List<Artikel> amazonList = null;
		try {
			amazonList = parser.parse(sourceUrlString.getLink());

		} catch (PreisRobotParserException e) {
			System.err.println("no valid elemnt was found on \n "
					+ sourceUrlString);
			throw new RuntimeException();
		} catch (Exception e) {
			e.printStackTrace();
			return amazonList;
		}

		for (Artikel amazonArtikel : amazonList) {

			System.out.println(amazonArtikel.getArtikelNr() + " "
					+ amazonArtikel.getPreis());
			dao.saveArtikel(amazonArtikel);

		}

		sourceUrlString.setLastvisited(new Date());
		dao.save(sourceUrlString);

		return amazonList;
	}

	@Override
	public void grapImage(Artikel artikel) {
		AmazonImageGrabber g = new AmazonImageGrabber();
		try {
			AmazonArtikelImage image = g.getImage(artikel.getImageLink());
			image.setArtikelId(artikel.getId());
			image.setArtikelNr(artikel.getArtikelNr());
			image.setCreationDate(new Date());
			image.setTyp(AmazonArtikelImage.getImageType(artikel
					.getImageLink()));
			dao.save(image);
		} catch (Exception e) {
			log.warn(artikel.getId() + " hat ungueltigen ImageLInk"
					+ artikel.getImageLink());
		}
	}
	
	@Transactional
	@Override
	public void grapAndSave(CrawlerLinkUrl sourceUrlString){
		List<Artikel> grapUrl = grapUrl(sourceUrlString);
		for (Artikel artikel : grapUrl) {
			grapImage(artikel);
		}
	}

}
